﻿using CLM.Gestao.Interfaces;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace CLM.Gestao.Administrador.UI
{
    public partial class Usuarios : Form, IFormulario
    {
        #region Propriedades e Variáveis

        BLL.Usuario Usuario = new BLL.Usuario();

        //Lista para armazenar os objetos apresentados na interface
        List<BLL.Usuario.Lista> ListaUsuarios;

        //Objeto utilizado para armazenas os valores novos ou de alteração de um registro
        BLL.Usuario.Lista UsuarioSelecionado = null;

        //Objeto utilizado para filtros
        BLL.Usuario.Lista UsuarioFiltro = null;

        //Objeto para controle do Estado da interface
        Util.Estado Estado = Util.Estado.Nenhum;

        #endregion

        #region Construtor

        public Usuarios()
        {
            try
            {
                InitializeComponent();

                var pos = this.PointToScreen(lblTitulo.Location);
                pos = picTitulo.PointToClient(pos);
                lblTitulo.Parent = picTitulo;
                lblTitulo.Location = pos;
                lblTitulo.BackColor = Color.Transparent;

                InicializaGrid();
                InicializaCombos();
                ConfiguraInterface(Util.Estado.Nenhum);
                Limpar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion Contrutor

        #region Eventos

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                UsuarioFiltro = null;
                Buscar();
                ConfiguraInterface(Util.Estado.Consulta);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnIncluir_Click(object sender, EventArgs e)
        {
            try
            {
                UsuarioSelecionado = new BLL.Usuario.Lista();
                ConfiguraInterface(Util.Estado.Inclusao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                ValidarInterface();
                AtualizaObjeto();
                Salvar();

                if (dgvUsuarios.DataSource == null)
                    CarregaObjetoFiltro();

                Cancelar();
                Buscar();

                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Cancelar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Tem certeza que deseja excluir o usuário?", "Atenção", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                {
                    Excluir();
                    Cancelar();
                    Buscar();

                    ConfiguraInterface(Util.Estado.Nenhum);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            try
            {
                Limpar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void btnExportar_Click(object sender, EventArgs e)
        {
            try
            {
                Exportar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void dgvUsuarios_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                UsuarioSelecionado = ListaUsuarios[dgvUsuarios.SelectedRows[0].Index];
                AtualizaInterface();
                ConfiguraInterface(Util.Estado.Alteracao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion Eventos

        #region Métodos Públicos

        public void CarregaObjetoFiltro()
        {
            UsuarioFiltro = new BLL.Usuario.Lista();
            if (!string.IsNullOrWhiteSpace(txtNomeUsuario.Text)) UsuarioFiltro.NomeUsuario = txtNomeUsuario.Text;
            if (!string.IsNullOrWhiteSpace(txtLoginUsuario.Text)) UsuarioFiltro.LoginUsuario = txtLoginUsuario.Text;
            if (cboPerfilAcesso.SelectedIndex > -1) UsuarioFiltro.IdPerfilAcesso = ((BLL.PerfilAcesso.Itens)cboPerfilAcesso.SelectedItem).IdPerfilAcesso;
        }

        public void InicializaCombos()
        {
            // Carrega o combo de Perfil de Acesso
            BLL.PerfilAcesso PerfilAcesso = new BLL.PerfilAcesso();
            cboPerfilAcesso.DataSource = PerfilAcesso.GetItens();
            cboPerfilAcesso.DisplayMember = "NomePerfilAcesso";
            cboPerfilAcesso.ValueMember = "IdPerfilAcesso";
        }

        public void InicializaGrid()
        {
            dgvUsuarios.AutoGenerateColumns = false;
            dgvUsuarios.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvUsuarios.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeUsuario", HeaderText = "Nome", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
            dgvUsuarios.Columns.Add(new DataGridViewColumn() { DataPropertyName = "LoginUsuario", HeaderText = "Login", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 150 });
            dgvUsuarios.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomePerfilAcesso", HeaderText = "Perfil de Acesso", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
        }

        public void ValidarInterface()
        {
            if (string.IsNullOrWhiteSpace(txtNomeUsuario.Text)) throw new Exception("O nome é obrigatório.");
            if (string.IsNullOrWhiteSpace(txtLoginUsuario.Text)) throw new Exception("O login é obrigatório.");
            if (cboPerfilAcesso.SelectedIndex < 0) throw new Exception("Selecione o perfil de acesso.");
        }

        public void AtualizaObjeto()
        {
            UsuarioSelecionado.NomeUsuario = txtNomeUsuario.Text;
            UsuarioSelecionado.LoginUsuario = txtLoginUsuario.Text;
            UsuarioSelecionado.IdPerfilAcesso = ((BLL.PerfilAcesso.Itens)cboPerfilAcesso.SelectedItem).IdPerfilAcesso;
            UsuarioSelecionado.NomePerfilAcesso = ((BLL.PerfilAcesso.Itens)cboPerfilAcesso.SelectedItem).NomePerfilAcesso;
        }

        public void AtualizaInterface()
        {
            txtNomeUsuario.Text = UsuarioSelecionado.NomeUsuario;
            txtLoginUsuario.Text = UsuarioSelecionado.LoginUsuario;
            if (UsuarioSelecionado.IdPerfilAcesso > 0)
                cboPerfilAcesso.SelectedValue = UsuarioSelecionado.IdPerfilAcesso;
            else
                cboPerfilAcesso.SelectedValue = -1;
        }

        public void Incluir()
        {
            Usuario.Add(new List<BLL.Usuario.Lista>() { UsuarioSelecionado });
            MessageBox.Show("Usuário cadastrado com sucesso.");
        }

        public void Alterar()
        {
            Usuario.Update(new List<BLL.Usuario.Lista>() { UsuarioSelecionado });
            MessageBox.Show("Usuário alterado com sucesso.");
        }

        public void Excluir()
        {
            Usuario.Delete(new List<BLL.Usuario.Lista>() { UsuarioSelecionado });
            MessageBox.Show("Usuário excluído com sucesso.");
        }

        public void Cancelar()
        {
            txtNomeUsuario.Text = string.Empty;
            txtLoginUsuario.Text = string.Empty;
            cboPerfilAcesso.SelectedIndex = -1;
        }

        public void Salvar()
        {
            switch (Estado)
            {
                case Util.Estado.Nenhum:
                    break;
                case Util.Estado.Inclusao:
                    Incluir();
                    break;
                case Util.Estado.Alteracao:
                    Alterar();
                    break;
                default:
                    break;
            }
        }

        public void Limpar()
        {
            Cancelar();
            UsuarioFiltro = null;
            dgvUsuarios.DataSource = null;
        }

        public void Buscar()
        {
            if (UsuarioFiltro == null) CarregaObjetoFiltro();
            ListaUsuarios = Usuario.GetLista(UsuarioFiltro);
            dgvUsuarios.DataSource = ListaUsuarios;

            dgvUsuarios.ClearSelection();
        }

        public void Exportar()
        {
            string FileName = string.Empty;

            SaveFileDialog sfdExportar = new SaveFileDialog();
            sfdExportar.Filter = "Arquivo Excel 2007-2010|*.xlsx|Arquivo Excel 97-2003|*.xls";
            sfdExportar.Title = "Salvar Arquivo";
            sfdExportar.FileName = "";
            if (sfdExportar.ShowDialog() == DialogResult.OK)
            {
                FileName = sfdExportar.FileNames[0];

                string[] Cabecalho = { "Nome", "Login", "Perfil de Acesso" };
                List<string> ListaCampos = new List<string> { "NomeUsuario", "LoginUsuario", "NomePerfilAcesso" };

                Exportacao.Excel<BLL.Usuario.Lista>.TipoExportacao = Exportacao.TipoExportacao.Exportacao;
                Exportacao.Excel<BLL.Usuario.Lista>.Exportar(ListaUsuarios, ListaCampos, Cabecalho, FileName, "Usuários");
            }
        }

        public void ConfiguraInterface(Util.Estado pEstado)
        {
            Estado = pEstado;

            if (pEstado == Util.Estado.Inclusao)
                dgvUsuarios.ClearSelection();

            btnIncluir.Enabled = (Estado == Util.Estado.Nenhum ||
                                 Estado == Util.Estado.Consulta) ? true : false;

            btnSalvar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            btnCancelar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            btnExcluir.Enabled = (Estado == Util.Estado.Alteracao) ? true : false;

            btnBuscar.Enabled = (Estado == Util.Estado.Nenhum ||
                                 Estado == Util.Estado.Consulta) ? true : false;

            btnLimpar.Enabled = (dgvUsuarios.DataSource != null) ? true : false;

            btnExportar.Enabled = (dgvUsuarios.DataSource != null) ? true : false;

            dgvUsuarios.Enabled = (Estado == Util.Estado.Consulta ||
                                 (Estado == Util.Estado.Nenhum && dgvUsuarios.DataSource != null)) ? true : false;
        }
        
        #endregion Métodos Públicos

        private void Usuarios_Load(object sender, EventArgs e)
        {

        }
    }
}